import 'dotenv/config';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Logger } from '@nestjs/common';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import helmet from 'helmet';
import { HttpExceptionFilter } from './filters/http-exception.filter';

const PORT = process.env.PORT || 8000;
const PREFIX = process.env.PREFIX || '/';
export const IS_DEV = process.env.NODE_ENV !== 'production';

async function bootstrap() {
  const logger: Logger = new Logger('main.ts');
  console.log(IS_DEV, '是否为开发环境');
  const app = await NestFactory.create(AppModule, {
    // 开启日志级别打印
    logger: IS_DEV ? ['log', 'debug', 'error', 'warn'] : ['error', 'warn'],
  });

  // 允许跨域请求
  app.enableCors();
  // 给请求添加prefix
  app.setGlobalPrefix(PREFIX);

  // 配置api文档信息（不是生产环境配置文档）
  if (IS_DEV) {
    const options = new DocumentBuilder()
      .setTitle('权限系统管理  api文档')
      .setDescription('权限系统管理  api接口文档')
      .setBasePath(PREFIX)
      .addBearerAuth({ type: 'apiKey', in: 'header', name: 'token' })
      .setVersion('0.0.1')
      .build();

    const document = SwaggerModule.createDocument(app, options);
    SwaggerModule.setup(`${PREFIX}/docs`, app, document);
  }

  // Web漏洞
  app.use(helmet());

  // 全局注册错误的过滤器(错误异常)
  app.useGlobalFilters(new HttpExceptionFilter());

  await app.listen(PORT, () => {
    logger.log(`服务已经启动，接口访问：http://www.localhost:${PORT}${PREFIX}`);
    logger.log(
      `服务已经启动，文档访问：http://www.localhost:${PORT}${PREFIX}/docs`,
    );
  });
}
bootstrap();
